	// JavaScript Document
	var W_OK = 0; //检查成功
	var W_TRY = 1; //试用
	var W_NO_FOUND = 2; //没有找到校验服务器
	var W_EXCEED_NUM = 3; //超过用户数了


	function getEvent(parseEvent) {
		//	if(g_msg) return;
		$.ajax({
			type: "post",
			url: "http://127.0.0.1:3001/msg/",
			dataType: "jsonp",
			timeout: 30000,
			data: {
				"act": "get",
				"timeout": 30000
			},
			//data中的timeout值要跟前面AJAX的timeout值相等，不设置默认是30000
			success: function(data, textStatus) {
				// $("#StatusArea").append("--- " + data );
				if (textStatus == "success") {
					getEvent(parseEvent);
				}
				if (data != null) {
					//AppendStatus(data+ "--\r\n");
					parseEvent(data.ch, data.e_type, data.e_handle, data.l_result, data.e_data);
				}
			},
			complete: function(XMLHttpRequest, textStatus) {
				if (XMLHttpRequest.readyState == "4") {
					//alert(XMLHttpRequest.responseText);  
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				//$("#StatusArea").append("[state: " + textStatus + ", error: " + errorThrown + " ]<br/>");
				if (textStatus == "timeout") { // 请求超时
					// 递归调用
					getEvent(parseEvent);
					// 其他错误，如网络错误等
				} else {
					getEvent(parseEvent);
				}
			}
		});
		//setTimeout(getEvent ,1000);
	}

	function sendCmd(cmd_name, paraObj, resultCallback) {
		var nResult = -99;
		var bSync = false;
		$.ajax({
			type: "post",
			url: "http://127.0.0.1:3001/cmd/",
			dataType: "jsonp",
			data: {
				"act": cmd_name,
				"para": JSON.stringify(paraObj)
			},
			async: false,
			success: function(data, textStatus) {
				// $("#StatusArea").append("--- " + data );
				bSync = true;
				nResult = data.result;
				console.log(nResult)
				console.log(resultCallback)
				console.log(resultCallback != "" && resultCallback != null)
				if (resultCallback != "" && resultCallback != null){
					console.log(nResult)
					resultCallback(nResult);
				}
				return nResult;
			},
			complete: function(XMLHttpRequest, textStatus) {
				if (XMLHttpRequest.readyState == "4") {
					//alert(XMLHttpRequest.responseText);  
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				alert("网络错误! " + textStatus + ", error: " + errorThrown);
				if (textStatus == "timeout") { // 请求超时
					//getEvent(); // 递归调用
					// 其他错误，如网络错误等
				} else {
					//getEvent();
				}
				bSync = true;
			}
		});
		//	Sleep(500);
		//	var timestamp=new Date().getTime();
		//	alert(timestamp+"---"+ nResult);
		
		return nResult;
	}
	//检查本地设备服务程序是否安装命令
	function check_ver(iVer, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = iVer;
		$.ajax({
			type: "post",
			url: "http://127.0.0.1:3001/cmd/",
			dataType: "jsonp",
			data: {
				"act": "check_ver",
				"para": JSON.stringify(paraObj)
			},
			timeout: 1000,
			//async:false,
			success: function(data, textStatus) {
				// $("#StatusArea").append("--- " + data );
				nResult = data.result;
				if (nextFunc != "" && nextFunc != null)
					nextFunc(nResult);
				return nResult;
			},
			complete: function(XMLHttpRequest, textStatus) {
				if (XMLHttpRequest.readyState == "4") {
					//alert(XMLHttpRequest.responseText);  
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				//alert("没有安装! " + textStatus + ", error: " + errorThrown );
				nextFunc(nResult);
				if (textStatus == "timeout") { // 请求超时
					//getEvent(); // 递归调用
					// 其他错误，如网络错误等
				} else {
					//getEvent();
				}
				return nResult;
			}
		});
		return nResult;
	}

	function set_check_data_url(strUrl, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = strUrl;
		nResult = sendCmd("set_check_url", paraObj, nextFunc);
		return nResult;
	}
	//最右边的是执行下一个函数的参数
	//下一步函数格式为function nextFunc(nResult)内含上次函数执行后返回的结果
	function OpenDevice(nDevice_type, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nDevice_type;
		paraObj.b = 0;
		nResult = sendCmd("QNV_OpenDevice", paraObj, nextFunc);
		return nResult;
	}

	function CloseDevice(nDevice_type, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nDevice_type;
		paraObj.b = 0;
		nResult = sendCmd("QNV_CloseDevice", paraObj, nextFunc);
		return nResult;
	}

	function SetDevCtrl(nChannelID, uCtrlType, nValue, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uCtrlType;
		paraObj.c = nValue;
		nResult = sendCmd("QNV_SetDevCtrl", paraObj, nextFunc);
		return nResult;
	}

	function GetDevCtrl(nChannelID, uCtrlType, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uCtrlType;
		nResult = sendCmd("QNV_GetDevCtrl", paraObj, nextFunc);
		return nResult;
	}

	function SetParam(nChannelID, uParamType, nValue, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uParamType;
		paraObj.c = nValue;
		nResult = sendCmd("QNV_SetParam", paraObj, nextFunc);
		return nResult;
	}

	function GetParam(nChannelID, uParamType, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uParamType;
		nResult = sendCmd("QNV_GetParam", paraObj, nextFunc);
		return nResult;
	}

	function PlayFile(nChannelID, uPlayType, nValue, nValueEx, pValue, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uPlayType;
		paraObj.c = nValue;
		paraObj.d = nValueEx;
		paraObj.e = pValue;
		nResult = sendCmd("QNV_PlayFile", paraObj, nextFunc);
		return nResult;
	}

	function PlayMultiFile(nChannelID, uPlayType, nValue, nValueEx, pValue, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uPlayType;
		paraObj.c = nValue;
		paraObj.d = nValueEx;
		paraObj.e = pValue;
		nResult = sendCmd("QNV_PlayMultiFile", paraObj, nextFunc);
		return nResult;
	}

	function PlayString(nChannelID, uPlayType, nValue, nValueEx, pValue, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uPlayType;
		paraObj.c = nValue;
		paraObj.d = nValueEx;
		paraObj.e = pValue;
		nResult = sendCmd("QNV_PlayString", paraObj, nextFunc);
		return nResult;
	}

	function RecordFile(nChannelID, uRecordType, nValue, nValueEx, pValue, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uRecordType;
		paraObj.c = nValue;
		paraObj.d = nValueEx;
		paraObj.e = pValue;
		nResult = sendCmd("QNV_RecordFile", paraObj, nextFunc);
		return nResult;
	}

	function Conference(nChannelID, nConfID, uConfType, nValue, pValue, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = nConfID;
		paraObj.c = uConfType;
		paraObj.d = nValue;
		paraObj.e = pValue;
		nResult = sendCmd("QNV_Conference", paraObj, nextFunc);
		return nResult;
	}

	function General(nChannelID, uGeneralType, nValue, pValue, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uGeneralType;
		paraObj.c = nValue;
		paraObj.d = pValue;
		nResult = sendCmd("QNV_General", paraObj, nextFunc);
		return nResult;
	}

	function DevInfo(nChannelID, uDevInfoType, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uDevInfoType;
		nResult = sendCmd("QNV_DevInfo", paraObj, nextFunc);
		return nResult;
	}
	//nextFunc参数是一个对象包含result和缓存
	function Storage(nDevID, uOPType, uSeek, pPwd, pValue, nextFunc) {
		var paraObj = {};
		paraObj.a = nDevID;
		paraObj.b = uOPType;
		paraObj.c = uSeek;
		paraObj.d = pPwd;
		paraObj.e = pValue;
		var objResult = {};
		objResult.result = -99;
		$.ajax({
			type: "post",
			url: "http://127.0.0.1:3001/cmd/",
			dataType: "jsonp",
			data: {
				"act": "QNV_Storage",
				"para": JSON.stringify(paraObj)
			},
			async: false,
			success: function(data) {
				// $("#StatusArea").append("--- " + data );
				objResult.result = data.result;
				objResult.content = data.content;
				if (data.outbuf != null)
					objResult.outbuf = decodeURIComponent(data.outbuf);
				if (nextFunc != null)
					nextFunc(objResult);
			},
			complete: function(XMLHttpRequest, textStatus) {
				if (XMLHttpRequest.readyState == "4") {
					//alert(XMLHttpRequest.responseText);  
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				alert("网络错误! " + textStatus + ", error: " + errorThrown);
				if (textStatus == "timeout") { // 请求超时
					//getEvent(); // 递归调用
					// 其他错误，如网络错误等
				} else {
					//getEvent();
				}
			}
		});
		return objResult;
	}
	//接受文件在asp,php的参数为filedata1="文件名"
	function Remote(uRemoteType, nValue, pInValue, pInValueEx, pOutValue, nBufSize, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = uRemoteType;
		paraObj.b = nValue;
		paraObj.c = pInValue;
		paraObj.d = pInValueEx;
		paraObj.e = pOutValue;

		nResult = sendCmd("QNV_Remote", paraObj, nextFunc);
		return nResult;
	}
	//接受文件在asp,php的参数为filedata1="文件名"
	function Remote(uRemoteType, nValue, pInValue, pInValueEx, pOutValue, nBufSize, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = uRemoteType;
		paraObj.b = nValue;
		paraObj.c = pInValue;
		paraObj.d = pInValueEx;
		paraObj.e = pOutValue;

		nResult = sendCmd("QNV_Remote", paraObj, nextFunc);
		return nResult;
	}
	//返回一个结果对象
	function Tool(uToolType, nValue, pInValue, pInValueEx, nextFunc) {
		var objResult = {};
		var paraObj = {};
		paraObj.a = uToolType;
		paraObj.b = nValue;
		paraObj.c = pInValue;
		paraObj.d = pInValueEx;
		objResult.result = -99;
		$.ajax({
			type: "post",
			url: "http://127.0.0.1:3001/cmd/",
			dataType: "jsonp",
			data: {
				"act": "QNV_Tool",
				"para": JSON.stringify(paraObj)
			},
			async: false,
			success: function(data) {
				// $("#StatusArea").append("--- " + data );
				objResult.result = data.result;
				objResult.content = data.content;
				objResult.outbuf = "";
				if (data.outbuf != null) {
					objResult.outbuf = decodeURIComponent(data.outbuf);
				}
				switch (uToolType) {
					case QNV_TOOL_PSTNEND:
					case QNV_TOOL_CODETYPE:
						if (nextFunc != null)
							nextFunc(objResult.result);
						return objResult.result;
					case QNV_TOOL_LOCATION:
						{
							if (nextFunc != null)
								nextFunc(objResult.outbuf);
							return objResult.outbuf;
						}
					case QNV_TOOL_DISKFREESPACE:
					case QNV_TOOL_DISKTOTALSPACE:
						{
							if (nextFunc != null)
								nextFunc(objResult.result);
							return objResult.result;
						}
					case QNV_TOOL_DISKLIST:
						{
							if (nextFunc != null)
								nextFunc(objResult.outbuf);
							return objResult.outbuf;
						}
					case QNV_TOOL_CONVERTFMT:
						if (nextFunc != null)
							nextFunc(objResult.result);
						return objResult.result;
					case QNV_TOOL_SELECTDIRECTORY:
						{
							if (nextFunc != null)
								nextFunc(objResult.outbuf);
							return objResult.outbuf;
						}
					case QNV_TOOL_SELECTFILE:
						{
							if (nextFunc != null) {
								nextFunc(objResult.outbuf);
							}
							return objResult.outbuf;
						}
					case QNV_TOOL_CONVERTTOTIFF:
						{
							if (nextFunc != null)
								nextFunc(objResult.result);
							return objResult.result;
						}
					case QNV_TOOL_SLEEP:
						if (nextFunc != null)
							nextFunc(objResult.result);
						return objResult.result;
				}
			},
			complete: function(XMLHttpRequest, textStatus) {
				if (XMLHttpRequest.readyState == "4") {
					//alert(XMLHttpRequest.responseText);  
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				alert("网络错误! " + textStatus + ", error: " + errorThrown);
				if (textStatus == "timeout") { // 请求超时
					//getEvent(); // 递归调用
					// 其他错误，如网络错误等
				} else {
					//getEvent();
				}
			}
		});

		return objResult;
	}

	function CallLog(nChannelID, uLogType, nextFunc) {
		var objResult = {};
		var paraObj = {};
		paraObj.a = nChannelID;
		paraObj.b = uLogType;
		objResult.result = -99;
		$.ajax({
			type: "post",
			url: "http://127.0.0.1:3001/cmd/",
			dataType: "jsonp",
			data: {
				"act": "QNV_CallLog",
				"para": JSON.stringify(paraObj)
			},
			async: false,
			success: function(data) {
				// $("#StatusArea").append("--- " + data );
				objResult.result = data.result;
				objResult.content = data.content;
				if (data.outbuf != null)
					objResult.outbuf = decodeURIComponent(data.outbuf);
				switch (uToolType) {
					case QNV_CALLLOG_BEGINTIME:
					case QNV_CALLLOG_RINGBACKTIME:
					case QNV_CALLLOG_CONNECTEDTIME:
					case QNV_CALLLOG_ENDTIME:
					case QNV_CALLLOG_CALLTYPE:
					case QNV_CALLLOG_CALLRESULT:
					case QNV_CALLLOG_DELRECFILE:
					case QNV_CALLLOG_RESET:
						if (nextFunc != null)
							nextFunc(objResult.result);
						return objResult.result;
					case QNV_CALLLOG_CALLID:
					case QNV_CALLLOG_CALLRECFILE:
						if (nextFunc != null)
							nextFunc(objResult.outbuf);
						return objResult.outbuf;;
				}

			},
			complete: function(XMLHttpRequest, textStatus) {
				if (XMLHttpRequest.readyState == "4") {
					//alert(XMLHttpRequest.responseText);  
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				alert("网络错误! " + textStatus + ", error: " + errorThrown);
				if (textStatus == "timeout") { // 请求超时
					//getEvent(); // 递归调用
					// 其他错误，如网络错误等
				} else {
					//getEvent();
				}
			}
		});

		return objResult;
	}
	//URL中所有参数可以以p1=v1&p2=v2赋值，以post格式传送
	////接受文件在asp,php的参数为file="文件名
	//strFilePath问文件本地路径
	//nextFunc下一条函数
	function UploadFile(strUrl, strFilePath, nextFunc) {
		var nResult = -99;
		var paraObj = {};
		paraObj.a = strUrl;
		paraObj.b = strFilePath;

		nResult = sendCmd("UploadFile", paraObj, nextFunc);
		return nResult;
	}

